/**
 * @bsp_debug.c
 *
 * USART1 TX Pin  - PA9
 * USART1 TX Pin  - PA10(not used)
 *
 * @copyright This file create by rensuiyi ,all right reserve!
 *
 * @author rensuiyi
 *
 * @date 20-10-2 下午7:36
 */
#include "bsp_debug.h"
#include "stm32f2xx_ll_gpio.h"
#include "stm32f2xx_ll_usart.h"
#include "stm32f2xx_ll_bus.h"

#define BSP_DEBUG_GPIO_PORT        GPIOA
#define BSP_DEBUG_UART             USART1

static void bsp_io_register_init(void) {
  LL_GPIO_InitTypeDef init;

  LL_GPIO_StructInit(&init);
  init.Alternate = LL_GPIO_AF_7;
  init.Mode = LL_GPIO_MODE_ALTERNATE;
  init.Pin = LL_GPIO_PIN_9;
  
  LL_GPIO_Init(BSP_DEBUG_GPIO_PORT,&init);
}

static void bsp_uart_register_init(void) {
  LL_USART_InitTypeDef uart_init;
  LL_USART_StructInit(&uart_init);

  uart_init.BaudRate = 115200;
  uart_init.DataWidth = LL_USART_DATAWIDTH_8B;
  uart_init.StopBits = LL_USART_STOPBITS_1;
  uart_init.Parity = LL_USART_PARITY_NONE;
  
  uart_init.HardwareFlowControl = LL_USART_HWCONTROL_NONE;
  uart_init.TransferDirection = LL_USART_DIRECTION_TX;

  LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_USART1);
  LL_USART_Disable(BSP_DEBUG_UART);
  LL_USART_Init(BSP_DEBUG_UART,&uart_init);
  LL_USART_Enable(BSP_DEBUG_UART);
}

int bsp_debug_port_send_string(const char* pstr, int len) {
  for (int i = 0; i < len;i++) {
    LL_USART_TransmitData8(BSP_DEBUG_UART,pstr[i]);
    while (!LL_USART_IsActiveFlag_TC(BSP_DEBUG_UART)) {
    }
  }
  return len;
}

int bsp_debug_init(void) {
  bsp_io_register_init();
  bsp_uart_register_init();

  return 0;
}
